package com.example.dictionary.repository;

import com.example.memento.model.DownloadTask;
import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.query.QueryWrapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

import static com.example.memento.model.table.DownloadTaskTableDef.DOWNLOAD_TASK;

/**
 * 下载任务Mapper
 * 使用MyBatis-Flex进行数据访问
 */
@Mapper
public interface DownloadTaskMapper extends BaseMapper<DownloadTask> {
    
    /**
     * 根据任务ID查找
     */
    @Select("SELECT * FROM download_tasks WHERE task_id = #{taskId}")
    DownloadTask findByTaskId(@Param("taskId") String taskId);
    
    /**
     * 根据词典源名称查找任务
     */
    default List<DownloadTask> findBySourceName(String sourceName) {
        return selectListByQuery(QueryWrapper.create()
                .where(DOWNLOAD_TASK.SOURCE_NAME.eq(sourceName))
                .orderBy(DOWNLOAD_TASK.CREATED_AT.desc()));
    }
    
    /**
     * 根据状态查找任务
     */
    default List<DownloadTask> findByStatus(DownloadTask.TaskStatus status) {
        return selectListByQuery(QueryWrapper.create()
                .where(DOWNLOAD_TASK.STATUS.eq(status))
                .orderBy(DOWNLOAD_TASK.CREATED_AT.desc()));
    }
    
    /**
     * 查找进行中的任务
     */
    default List<DownloadTask> findInProgressTasks() {
        return selectListByQuery(QueryWrapper.create()
                .where(DOWNLOAD_TASK.STATUS.eq(DownloadTask.TaskStatus.DOWNLOADING))
                .orderBy(DOWNLOAD_TASK.CREATED_AT.desc()));
    }
    
    /**
     * 查找已完成的任务
     */
    default List<DownloadTask> findCompletedTasks() {
        return selectListByQuery(QueryWrapper.create()
                .where(DOWNLOAD_TASK.STATUS.eq(DownloadTask.TaskStatus.COMPLETED))
                .orderBy(DOWNLOAD_TASK.END_TIME.desc()));
    }
    
    /**
     * 查找失败的任务
     */
    default List<DownloadTask> findFailedTasks() {
        return selectListByQuery(QueryWrapper.create()
                .where(DOWNLOAD_TASK.STATUS.eq(DownloadTask.TaskStatus.FAILED))
                .orderBy(DOWNLOAD_TASK.CREATED_AT.desc()));
    }
    
    /**
     * 更新任务状态
     */
    @Update("UPDATE download_tasks SET status = #{status}, updated_at = CURRENT_TIMESTAMP WHERE task_id = #{taskId}")
    int updateStatus(@Param("taskId") String taskId, @Param("status") DownloadTask.TaskStatus status);
    
    /**
     * 更新下载进度
     */
    @Update("UPDATE download_tasks SET downloaded_bytes = #{downloadedBytes}, total_bytes = #{totalBytes}, updated_at = CURRENT_TIMESTAMP WHERE task_id = #{taskId}")
    int updateProgress(@Param("taskId") String taskId, @Param("downloadedBytes") Long downloadedBytes, @Param("totalBytes") Long totalBytes);
    
    /**
     * 更新错误信息
     */
    @Update("UPDATE download_tasks SET error_message = #{errorMessage}, status = #{status}, updated_at = CURRENT_TIMESTAMP WHERE task_id = #{taskId}")
    int updateError(@Param("taskId") String taskId, @Param("errorMessage") String errorMessage, @Param("status") DownloadTask.TaskStatus status);
    
    /**
     * 统计任务数量
     */
    @Select("SELECT COUNT(*) FROM download_tasks")
    long countAll();
    
    /**
     * 按状态统计
     */
    @Select("SELECT status, COUNT(*) as count FROM download_tasks GROUP BY status")
    List<Object> countByStatus();
    
    /**
     * 按词典源统计
     */
    @Select("SELECT source_name, COUNT(*) as count FROM download_tasks GROUP BY source_name")
    List<Object> countBySource();
}
